package com.tedu.api.list;

import org.junit.Test;

import java.util.Deque;
import java.util.LinkedList;
import java.util.Queue;

/**
 * Collection集合下 子集和【叫队列】  包位置：java.util
 * Queue    队列     单端队列
 * Deque     队列     双端队列   “Deque接口---继承---Queue”
 * 作用：保存数据，有序存储和处理，功能：数据缓冲或者多线程协调工作！
 *
 * 队列实现类：
 * LinkedList  ：  双向链表
 */
public class QueueAPI {

@Test
public void testQueue(){
        //创建队列--多态--LinkedList
        Queue<String> queue=new LinkedList<>();
        /**
         * offer()  ----add()一样
         * 作用：入队操作，队尾追加元素
         */
        queue.offer("青花瓷");
        queue.offer("冬眠");
        queue.offer("我的滑板鞋");
        queue.offer("体面");
        System.out.println("Queue队列"+queue);
    /**
     * poll()
     * 作用：出队操作，获取队首元素，并且删除队列中队首
     * peek()
     * 作用：出队操作，获取对首操作，不删除队列中队首
     */
    queue.poll();  queue.poll();//删除队首元素
    System.out.println("Queue队列："+queue);
    String str=queue.peek();
    System.out.println("队首元素："+str);
    System.out.println("Queue队列："+queue);
/**
 * 需求：1.遍历队列，---while---只遍历一次队列【队列元素消失】
 *  提示：while  条件：拿到队列当中总长度  size（）>0
 *  需求：2.遍历队列---增强for---队列元素不消失
 *  提示：  for   条件  ：E  e  ：队列
 */
//while(queue.size()>0){  //true:队列中总数>0;： 队列中有元素
//    str=queue.poll();  //获取队首删除队列中队首
//    System.out.println("获取队列元素："+str);
//}
    //System.out.println("Queue队列元素："+queue);
for (String e:queue){
    System.out.println("队列元素："+e);
}
    System.out.println("Queue队列："+queue);
}
@Test
    public void testDeque(){
    //创建Deque  双端队列  方法基本一致，部分方法不一致
    Deque<String> deque =new LinkedList<>();
    deque.offer("任贤齐");deque.offer("王菲");
    deque.offer("毛阿敏");deque.offer("薛之谦");
    System.out.println("双端队列："+deque);
    //offerFirst（）  队首添加元素     OfferLast（）  对尾添加元素
    deque.offerFirst("蔡徐坤"); deque.offerLast("王市委");
    System.out.println("双端队列[首尾添加元素]："+deque);
    //getFirst()   获取队首   getLast（）  获取队尾
    System.out.println("获取队列中队首："+deque.getFirst());
    System.out.println("获取队列中队尾："+deque.getLast());
    //pollFirst()   获取队首，删除队列中队首  【单端：poll类似】
    //pollLast()    获取队尾，删除队列中对尾
    String wang=deque.pollLast();
    System.out.println("队尾元素："+wang);
    System.out.println("双端队列："+deque);

}
@Test
    public void testStack(){
    //创建双端队列--支持栈结构
    Deque<String> stack=new LinkedList<>();
    /**
     * push()  Deque   独有的方法--支持栈结构
     * ---offer---：Queue---add：Collection接口  【添加】
     * 作用：【添加：往栈压入一个元素】  压栈操作
     */
    stack.push("夯大力");
    stack.push("恶搞之家");
    stack.push("喜羊羊");
    stack.push("魔方大厦");
    System.out.println("栈结构："+stack);
    /**
     * pop()    出栈一个尾元素---pollLast
     */
    String lass=stack.pop();
    System.out.println("出栈尾元素："+lass);
    System.out.println("栈结构："+stack);
    //面试题：pop、poll、peek的使用区别？

    //  需求1:遍历栈结构---while---元素出栈，队列元素需要清空
//    while (stack.size()>0){
//        String woshishabi=stack.pop();
//        System.out.println("遍历："+woshishabi);
//    }
//    System.out.println("删除后："+stack);
    for (String queshishabi:stack){
        System.out.println("增强for遍历："+queshishabi);
    }


    //需求2：遍历栈结构---增强for---元素遍历成功，队列元素不变



}
}